/**
给你一个数组 nums 和一个值 val，你需要 原地 移除所有数值等于 val 的元素，并返回移除后数组的新长度。
不要使用额外的数组空间，你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。
示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
你不需要考虑数组中超出新长度后面的元素。
#
 */
function removeItem(list, target) {
  let leftIndex = 0;
  let rightIndex = list.length - 1;
  while (leftIndex <= rightIndex) {
    while (leftIndex <= rightIndex && list[leftIndex] != target) {
      ++leftIndex;
    }
    while (leftIndex <= rightIndex && list[rightIndex] == target) {
      --rightIndex;
    }
    if (leftIndex < rightIndex) {
      list[leftIndex++] = list[rightIndex--];
    }
  }
  return leftIndex;
}
console.log("结果:", removeItem([3, 2, 2, 3], 3));
// console.log("结果:", removeItem([0, 1, 2, 2, 3, 0, 4, 2], 2));

// 方法二：
function removeItem2(list, target) {
  let showIndex = 0;
  for (let fastIndex = 0; fastIndex < list.length; fastIndex++) {
    if (target != list[fastIndex]) {
      list[showIndex++] = list[fastIndex];
    }
  }
  console.log("改变后的数组：", list);

  return showIndex;
}

console.log("方法2：", removeItem2([3, 2, 2, 3], 3));

/**
总结：
相对来说，方法二更容易理解一些，方法可能有多种，吃透一种即可
 */
